import Sprite from './sprite';
import DataBus from '../databus';

/**
 * 伤害文本类
 * 用于显示角色受到的伤害数值
 */
export default class DamageText extends Sprite {
  /**
   * 构造函数
   * @param {number} value - 伤害值
   * @param {number} x - x坐标
   * @param {number} y - y坐标
   */
  constructor(value = 0, x = 0, y = 0) {
    super('', 0, 0, 0); // 不需要图片，直接绘制文本
    this.value = value; // 伤害值
    this.x = x; // x坐标
    this.y = y; // y坐标
    this.duration = 60; // 显示持续时间（帧数）
    this.timer = 0; // 计时器
    this.speedY = -2; // 向上移动速度
    this.alpha = 1; // 透明度
    this.fontSize = 30; // 字体大小
    this.color = '#ff0000'; // 字体颜色
  }

  /**
   * 初始化方法
   * 用于对象池复用
   */
  init(value, x, y) {
    this.value = value;
    this.x = x;
    this.y = y;
    this.timer = 0;
    this.alpha = 1;
    this.isActive = true;
    return this;
  }

  /**
   * 更新方法
   */
  update() {
    if (!this.isActive) return;

    this.timer++;
    this.y += this.speedY; // 向上移动

    // 随着时间推移降低透明度
    this.alpha = 1 - (this.timer / this.duration);

    // 检查是否超过显示时间
    if (this.timer >= this.duration) {
      this.isActive = false;
      GameGlobal.databus.removeDamageText(this);
    }
  }

  /**
   * 渲染方法
   */
  render(ctx) {
    if (!this.isActive) return;

    ctx.save();
    ctx.globalAlpha = this.alpha;
    ctx.font = `${this.fontSize}px Arial`;
    ctx.fillStyle = this.color;
    ctx.textAlign = 'center';
    ctx.fillText(this.value.toString(), this.x, this.y);
    ctx.restore();
  }

  /**
   * 从对象池获取伤害文本实例
   */
  static create(value, x, y) {
    const databus = GameGlobal.databus;
    const text = databus.pool.getItemByClass('damageText', DamageText).init(value, x, y);
    databus.addDamageText(text);
    return text;
  }
}

// 无需手动注册，使用时通过getItemByClass自动管理